package com.skyyan.netty.jjf.util;

import java.nio.charset.StandardCharsets;

/**
 * 字节去除 前后补0操作
 * @author skyyan
 */
public class JJFByteUtil {

    /**
     * 去除字节数组前后填充的 0x00，返回重构后的有效字节数组
     */
    public static byte[] trimPadding(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return new byte[0];
        }

        // 1. 找起始位置（第一个非 0x00）
        int start = 0;
        while (start < bytes.length && bytes[start] == 0) {
            start++;
        }

        // 2. 找结束位置（最后一个非 0x00）
        int end = bytes.length - 1;
        while (end >= 0 && bytes[end] == 0) {
            end--;
        }

        // 3. 判断是否无有效数据
        if (start > end) {
            return new byte[0]; // 全是 0x00
        }

        // 4. 计算有效长度，创建新数组
        int validLength = end - start + 1;
        byte[] trimmed = new byte[validLength];

        // 5. 复制有效数据
        System.arraycopy(bytes, start, trimmed, 0, validLength);

        return trimmed;
    }

    /**
     * byte数组 转换汉字 数组位数有可能会有前后 补0的填充
     * @param bytes
     * @return
     */
    public static String safeDecodeUsername(byte[] bytes) {
        byte[] cleaned = trimPadding(bytes);
        if (cleaned.length == 0) {
            return "";
        }
        return new String(cleaned, StandardCharsets.UTF_8).trim();
    }

    // 辅助方法：字节数组转 Hex 字符串（用于调试）
    public static String bytesToHex(byte[] bytes) {
        if(bytes==null){
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b & 0xFF));
        }
        return sb.toString();
    }
    // 测试示例
    public static void main(String[] args)throws Exception {
        // 示例：前面3个0，中间"张三"（6字节），后面3个0 → 共12字节
        byte[] username = {
                0x00, 0x00, 0x00,           // 前填充
                (byte)0xE5, (byte)0xBC, (byte)0xA0,  // 张
                (byte)0xE4, (byte)0xB8, (byte)0x89,  // 三
                0x00, 0x00, 0x00            // 后填充
        };

        // 1. 重构：去掉前后 0x00
        byte[] cleaned = trimPadding(username);

        // 输出调试信息
        System.out.println("原数组长度: " + username.length);  // 12
        System.out.println("新数组长度: " + cleaned.length);  // 6
        System.out.println("新数组 Hex: " + bytesToHex(cleaned)); // E5BCA0E4B889

        // 2. 转为字符串
        String result = safeDecodeUsername(username);
        System.out.println("解析结果: " + result); // 输出：张三

        System.out.println("+++++++++++++++++++++++");
        String name="张";
        //汉字转换成byte 数组 并占12个字节 不足 末尾补0
        byte[] encoded = FixedLengthUtf8Encoder.encodeTo12Bytes(name);
        System.out.println("汉字【"+name+"】 转换成12个字节数组,位数长度不够 末尾补0");
        System.out.println("输入: \"" + name + "  \" → Hex: " + bytesToHex(encoded));

        //补0后数据解析 并转换成汉字
        result = safeDecodeUsername(encoded);
        System.out.println("转换成汉字为:"+result);
    }

}
